package com.luoyi.util.ovs;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.luoyi.util.ovs.annotation.DataOut;
import com.luoyi.util.ovs.model.IndexDimensionRuleVo;
import com.luoyi.util.ovs.model.IndexDimensionVo;
import com.luoyi.util.ovs.model.IndexFlowVo;
import com.luoyi.util.ovs.model.WorkflowIndexVo;
import com.luoyi.util.ExportUtil;
import io.swagger.annotations.ApiModelProperty;
import org.apache.poi.ss.usermodel.Workbook;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 海外项目生成Excel模板
 *
 * @author xt
 */
public class OvsExcelTemplateGenerate {

    /**
     * 根据给定的Excel导出实体列表，生成一个用于导出的临时JSON对象列表
     * 这个方法主要用来构造一个适用于某种特定导出格式的JSON结构，以便于后续的导出操作
     *
     * @param excelExportEntities Excel导出实体列表，包含了需要导出的字段信息
     * @return 返回一个临时的JSON对象列表，用于后续的导出操作
     */
    public static List<JSONObject> getTempJson(List<ExcelExportEntity> excelExportEntities) {
        // 初始化JSON对象列表，用于存放生成的JSON对象
        List<JSONObject> jsonObjects = new ArrayList<>();

        // 创建第一个JSON对象，用于存放遍历开始的标记
        JSONObject one = new JSONObject();
        // 获取第一个Excel导出实体，设置遍历开始的标记
        ExcelExportEntity excelExportEntity = excelExportEntities.get(0);
        one.set(excelExportEntity.getKey().toString(), "<jx:forEach items=\"${list}\" var=\"item\">");

        // 创建第二个JSON对象，用于存放具体的遍历内容
        JSONObject two = new JSONObject();
        // 遍历Excel导出实体列表，设置每个实体的键和格式化的值
        for (ExcelExportEntity exportEntity : excelExportEntities) {
            // 使用占位符设置键值对，占位符的具体格式由循环中的键决定
            two.set(exportEntity.getKey().toString(), StrUtil.format("${item.{}}", exportEntity.getKey()));
        }

        // 创建第三个JSON对象，用于存放遍历结束的标记
        JSONObject three = new JSONObject();
        // 获取第三个Excel导出实体，设置遍历结束的标记
        ExcelExportEntity excelExportEntity2 = excelExportEntities.get(0);
        three.set(excelExportEntity2.getKey().toString(), "</jx:forEach>");

        // 将三个JSON对象添加到列表中
        jsonObjects.add(one);
        jsonObjects.add(two);
        jsonObjects.add(three);
        // 返回生成的JSON对象列表
        return jsonObjects;
    }

    public static Workbook generateExportTemp(Class<?> dataOutClass)  {
        // 获取dataOutClass中所有字段注解DataOut
        List<DataOut> dataOutList = AnnotationUtil.getAnnotationFields(dataOutClass, DataOut.class);
        List<ApiModelProperty> apiList = AnnotationUtil.getAnnotationFields(dataOutClass, ApiModelProperty.class);
        Map<String, String> collect = apiList.stream().collect(Collectors.toMap(ApiModelProperty::name,
                ApiModelProperty::value));

        List<ExcelExportEntity> excelExportEntities = new ArrayList<>();
        for (DataOut dataOut : dataOutList) {
            ExcelExportEntity excelExportEntity = new ExcelExportEntity();
            excelExportEntity.setName(collect.get(dataOut.columnName()));
            excelExportEntity.setKey(dataOut.columnName());
            excelExportEntities.add(excelExportEntity);
        }
        List<JSONObject> tempJson = getTempJson(excelExportEntities);
        ExportParams params = new ExportParams();
        // 设置xlsx
        params.setType(ExcelType.XSSF);
        return ExcelExportUtil.exportExcel(params, excelExportEntities, tempJson);
    }

    public static void main(String[] args) throws IOException {
        extracted(IndexDimensionVo.class);
        extracted(IndexDimensionRuleVo.class);
        extracted(IndexFlowVo.class);
        extracted(WorkflowIndexVo.class);
    }

    private static void extracted(Class<?> clazz) throws IOException {
        Workbook sheets2 = generateExportTemp(clazz);
        String filePath = "C://Users/tail7/Desktop/新建文件夹/dataOut/{}_dataOut.xlsx";
        String format = StrUtil.format(filePath, StrUtil.lowerFirst(clazz.getSimpleName()));
        ExportUtil.saveWorkbookFile(format, sheets2);
    }


}
